命名是最难的两件事之一。
There are only two hard things in Computer Science: cache invalidation and naming things. — Phil Karlton
函数命名是函数做的事情的简写,要描述意图而非细节; 要精确,做到不需要读代码就能够理解函数功能。
特征
- 命名不精确
public void processChapter(long chapterId) {
Chapter chapter = this.repository.findByChapterId(chapterId);
if (chapter == null) {
throw new IllegalArgumentException("Unknown chapter [" + chapterId + "]");
}
chapter.setTranslationState(TranslationState.TRANSLATING);
this.repository.save(chapter);
}
命名中包含 data、info、flag、process、handle、build、maintain、manage、modify,就可能意味着你的命名是不准确的。
- 业务相关代码使用技术术语命名
除非技术术语就是你的业务语言
把命名给产品看一下,看能否看懂。
//bad
List<String> bookList;
//good
List<String> books;
//bad
class BookSharedPreferenceUtil{}
//good
class BookStorageUtil{}
- 英文规范
注意英文规范,团队一起建立业务词汇表。
- 不要用拼音,还不如用汉字直接表达;
- 英文拼写;typo 提示;
- 英文单词准确;
- 遵循语法规则;类名代表对象,使用名词;函数代表动作,使用动词。
引起的问题
代码难以理解,还需要去阅读详细代码。
重构方法
改变函数声明(函数重命名)
function circum(radius) {...}
// 简单做法
function circumference(radius) {...}
// 迁移式做法,可以不破坏现有的调用
function circum(radius) {
return circumference(radius);
}
function circumference(radius) {
return 2 * Math.PI * radius;
}
尽量通过函数的名称就能够看出一个函数的用途,而不是通过注释,甚至是实现代码。
变量改名
// 重构前
let a = height * width;
// 重构后
let area = height * width;
命名的使用范围越广,名字的好坏就越重要。
字段改名
// 重构前
class Organization {
get name() {...}
}
// 重构后
class Organization {
get title() {...}
}